package com.ruoyi.framework.web.service

import com.ruoyi.common.constant.CacheConstants
import com.ruoyi.common.constant.Constants
import com.ruoyi.common.constant.UserConstants
import com.ruoyi.common.core.domain.entity.SysUser
import com.ruoyi.common.core.domain.model.RegisterBody
import com.ruoyi.common.core.redis.RedisCache
import com.ruoyi.common.exception.user.CaptchaException
import com.ruoyi.common.exception.user.CaptchaExpireException
import com.ruoyi.common.utils.MessageUtils.message
import com.ruoyi.common.utils.MyStringUtils
import com.ruoyi.common.utils.SecurityUtils.encryptPassword
import com.ruoyi.framework.manager.AsyncManager.Companion.me
import com.ruoyi.framework.manager.factory.AsyncFactory.recordLogininfor
import com.ruoyi.system.service.ISysConfigService
import com.ruoyi.system.service.ISysUserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component

/**
 * 注册校验方法
 *
 * @author ruoyi
 */
@Component
class SysRegisterService {
    @Autowired
    private lateinit var userService: ISysUserService

    @Autowired
    private lateinit var configService: ISysConfigService

    @Autowired
    private lateinit var redisCache: RedisCache

    /**
     * 注册
     */
    fun register(registerBody: RegisterBody?): String {
        var msg = ""
        val username = registerBody?.username
        val password = registerBody?.password
        val sysUser = SysUser()
        sysUser.userName = username

        // 验证码开关
        val captchaEnabled = configService.selectCaptchaEnabled()
        if (captchaEnabled) {
            validateCaptcha(registerBody?.code, registerBody?.uuid)
        }
        if (MyStringUtils.isEmpty(username)) {
            msg = "用户名不能为空"
        } else if (MyStringUtils.isEmpty(password)) {
            msg = "用户密码不能为空"
        } else if (username!!.length < UserConstants.USERNAME_MIN_LENGTH
                || username.length > UserConstants.USERNAME_MAX_LENGTH) {
            msg = "账户长度必须在2到20个字符之间"
        } else if (password!!.length < UserConstants.PASSWORD_MIN_LENGTH
                || password.length > UserConstants.PASSWORD_MAX_LENGTH) {
            msg = "密码长度必须在5到20个字符之间"
        } else if (!userService.checkUserNameUnique(sysUser)) {
            msg = "保存用户'$username'失败，注册账号已存在"
        } else {
            sysUser.nickName = username
            sysUser.password = encryptPassword(password)
            val regFlag = userService.registerUser(sysUser)
            if (!regFlag) {
                msg = "注册失败,请联系系统管理人员"
            } else {
                me().execute(recordLogininfor(username, Constants.REGISTER, message("user.register.success")))
            }
        }
        return msg
    }

    /**
     * 校验验证码
     *
     * @param code 验证码
     * @param uuid 唯一标识
     * @return 结果
     */
    fun validateCaptcha(code: String?, uuid: String?) {
        val verifyKey = CacheConstants.CAPTCHA_CODE_KEY + MyStringUtils.nvl(uuid, "")
        val captcha = redisCache.getCacheObject<String>(verifyKey)
        redisCache.deleteObject(verifyKey)
        if (captcha == null) {
            throw CaptchaExpireException()
        }
        if (!code.equals(captcha, ignoreCase = true)) {
            throw CaptchaException()
        }
    }
}
